﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Persistence;
using Models;
using Models.Models;

namespace Services
{
    public class GerenciadorSegmento
    {
         private IUnitOfWork unitOfWork;
        private bool shared;

        /// <summary>
        /// Construtor pode ser acessado externamente e não compartilha contexto
        /// </summary>
        public GerenciadorSegmento()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        /// <summary>
        /// Construtor acessado apenas dentro do componentes service e permite compartilhar
        /// contexto com outras classes de negócio
        /// </summary>
        /// <param name="unitOfWork"></param>
        internal GerenciadorSegmento(IUnitOfWork unitOfWork)
        {
            this.unitOfWork = unitOfWork;
            shared = true;
        }

        /// <summary>
        /// Insere um novo na base de dados
        /// </summary>
        /// <param name="segmentoModel">Dados do modelo</param>
        /// <returns>Chave identificante na base</returns>
        public int Inserir(Segmento segmentoModel)
        {
            TB_SEGMENTO segmentoE = new TB_SEGMENTO();
            Atribuir(segmentoModel, segmentoE);
            unitOfWork.RepositorioSegmento.Inserir(segmentoE);
            unitOfWork.Commit(shared);
            return segmentoE.id_Segmento;
        }

        /// <summary>
        /// Altera dados na base de dados
        /// </summary>
        /// <param name="segmentoModel"></param>
        public void Editar(Segmento segmentoModel)
        {
            TB_SEGMENTO segmentoE = new TB_SEGMENTO();

            Atribuir(segmentoModel, segmentoE);
            unitOfWork.RepositorioSegmento.Editar(segmentoE);
            unitOfWork.Commit(shared);
        }

        /// <summary>
        /// Remove da base de dados
        /// </summary>
        /// <param name="segmentoModel"></param>
        public void Remover(int idSegmento)
        {
            unitOfWork.RepositorioSegmento.Remover(segmento => segmento.id_Segmento.Equals(idSegmento));
            unitOfWork.Commit(shared);
        }


        /// <summary>
        /// Consulta padrão para retornar dados do segmento como model
        /// </summary>
        /// <returns></returns>
        private IQueryable<Segmento> GetQuery()
        {
            IQueryable<TB_SEGMENTO> TB_SEGMENTO = unitOfWork.RepositorioSegmento.GetQueryable();
            var query = from segmento in TB_SEGMENTO 
                        select new Segmento
                        {
                            Id_Segmento = segmento.id_Segmento,
                            Id_Empresa = segmento.id_Empresa,
                            Descricao = segmento.descricao,
                           
                        };
            return query;
        }

        /// <summary>
        /// Obter todos as entidades cadastradas
        /// </summary>
        /// <returns></returns>
        public IEnumerable<Segmento> ObterTodos()
        {
            return GetQuery();
        }

        /// <summary>
        /// Obtém um segmento
        /// </summary>
        /// <param name="idSegmento">Identificador do segmento na base de dados</param>
        /// <returns>Segmento model</returns>
        public Segmento Obter(int idSegmento)
        {
            IEnumerable<Segmento> segmentos = GetQuery().Where(segmentoModel => segmentoModel.Id_Segmento.Equals(idSegmento));
            return segmentos.ElementAtOrDefault(0);
        }
        public Segmento ObterByEmpresa(int idEmpresa)
        {
            IEnumerable<Segmento> segmentos = GetQuery().Where(segmentoModel => segmentoModel.Id_Empresa.Equals(idEmpresa));
            return segmentos.ElementAtOrDefault(0);
        }

        /// <summary>
        /// Atribui dados do Segmento Model para o Segmento Entity
        /// </summary>
        /// <param name="segmentoModel">Objeto do modelo</param>
        /// <param name="segmentoE">Entity mapeada da base de dados</param>
        private void Atribuir(Segmento SegmentoModel, TB_SEGMENTO segmentoE)
        {
            segmentoE.id_Segmento = SegmentoModel.Id_Segmento;
            segmentoE.id_Empresa = SegmentoModel.Id_Empresa;
            segmentoE.descricao = SegmentoModel.Descricao;
        }
    }
}
